/**
 * 批量修复JSX文件的BOM字符问题
 * 
 * 使用方法: node fixBOM.js <目录路径>
 * 例如: node fixBOM.js packages/renderer/examples
 */

const fs = require('fs');
const path = require('path');

// BOM标记 (UTF-8的BOM是EF BB BF三个字节)
const BOM_MARKER = Buffer.from([0xEF, 0xBB, 0xBF]);

/**
 * 递归读取目录中的所有.jsx文件
 * @param {string} dir 目录路径
 * @param {Array<string>} filelist 文件列表
 * @returns {Array<string>} 文件路径列表
 */
function getAllJsxFiles(dir, filelist = []) {
  const files = fs.readdirSync(dir);
  
  files.forEach(file => {
    const filepath = path.join(dir, file);
    const stat = fs.statSync(filepath);
    
    if (stat.isDirectory()) {
      filelist = getAllJsxFiles(filepath, filelist);
    } else if (file.endsWith('.jsx')) {
      filelist.push(filepath);
    }
  });
  
  return filelist;
}

/**
 * 检查并移除文件的BOM标记
 * @param {string} filePath 文件路径
 * @returns {boolean} 是否进行了修改
 */
function removeBOM(filePath) {
  try {
    const buffer = fs.readFileSync(filePath);
    
    // 检查文件开头是否有BOM标记
    if (buffer.length >= 3 && 
        buffer[0] === BOM_MARKER[0] && 
        buffer[1] === BOM_MARKER[1] && 
        buffer[2] === BOM_MARKER[2]) {
      
      console.log(`发现BOM: ${filePath}`);
      
      // 移除BOM标记
      const content = buffer.slice(3);
      fs.writeFileSync(filePath, content);
      
      console.log(`已修复: ${filePath}`);
      return true;
    }
    
    return false;
  } catch (err) {
    console.error(`处理文件出错 ${filePath}:`, err);
    return false;
  }
}

// 主函数
function main() {
  // 获取命令行参数
  const targetDir = process.argv[2];
  
  if (!targetDir) {
    console.error('请指定要处理的目录路径');
    console.log('使用方法: node fixBOM.js <目录路径>');
    process.exit(1);
  }
  
  if (!fs.existsSync(targetDir) || !fs.statSync(targetDir).isDirectory()) {
    console.error(`目录不存在或不是有效的目录: ${targetDir}`);
    process.exit(1);
  }
  
  console.log(`开始扫描目录: ${targetDir}`);
  
  // 获取所有JSX文件
  const jsxFiles = getAllJsxFiles(targetDir);
  console.log(`找到 ${jsxFiles.length} 个JSX文件`);
  
  // 处理每个文件
  let fixedCount = 0;
  jsxFiles.forEach(file => {
    const fixed = removeBOM(file);
    if (fixed) fixedCount++;
  });
  
  console.log(`完成! 共修复了 ${fixedCount} 个文件的BOM问题`);
}

// 执行主函数
main(); 